//
//  HQCapture10ViewController.m
//  精通Objective-C
//
//  Created by 花强 on 2017/12/21.
//  Copyright © 2017年 花强. All rights reserved.
//

#import "HQCapture10ViewController.h"

@interface HQCapture10ViewController ()

@end

@implementation HQCapture10ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    /*
     
     第10章 Foundation框架中的常用类
     
     Foundation框架定义了OC程序通用API的基础层；
        包括根类，基础数据类型（如字符串）尅；
        原始数据类型的封装类；
        用于存储和操作其他对象的集合类；
        以及用于处理系统信息、实现网络和其他功能的类；
     
     本章介绍的Foundation框架中为大多数OC程序提供常用功能的类；
     
     10.1 根类
     
     根类（基类）：
        定义类类层次结构中该类下方所有类的公共接口和行为；
     
     Foundation框架提供了两个根类：NSObject和NSProxy；
        NSObject是大多数OC类层次结构的根类；
        NSProxy是专门用来实现代理对象的类；
        这两个根类都采用NSObject协议，该协议声明了所有OC对象的公用方法；
     
     10.1.1 NSObject协议
     
     NSObject协议限定了所有OC根类必须具有的API；
        因为协议中声明的方法和属性都是公有的，所以使用它们可以促进多个根类（包括自定义根类）的定义；
     
     NSObject协议声明的方法可分为下列几种：
     1）识别类和代理；
     2）识别和比较对象；
     3）描述对象；
     4）对象内省；
     5）发送消息；
     
     该协议还声明了一系列旧式方法，使用它们可以手动管理内存；
     鉴于首选ARC，不应再使用这些方法；
     
     10.1.2 NSObject类
     
     NSObject类是大多数OC类层次结构中的根类；
        实际上，几乎所有Foundation框架中的类都是NSObject类的子类；
        NSObject定义了一系列类和实例的方法，提供如下功能：
        1）基本对象行为；
        2）创建和初始化（对象，类）；
        3）动态特性（运行时系统的）；
     
     接下来介绍目前为止尚未使用过的一些NSObject类方法；
     
     1.基本行为
     NSObject类中的description类方法可以返回描述类内容的字符串；
        默认实现代码仅显示类的名称；
     
     NSObject协议声明了实例方法description，该方法的默认实现代码（有NSObject类提供）会显示对象的名称和内存地址；
     debugDescription实例方法能够返回对象调试信息，其默认实现代码的作用与description实例方法默认实现代码的作用相同；
     
     如果接收器和输入参数（对象）相等，isEqual：方法就返回布尔值YES；
        两个相等的对象必须拥有相同的散列值；
        如果接收器和输入参数的内存地址相同，那么isEqual：方法的默认实现代码（由NSObject类提供）就会返回YES；
     
     hash方法能够返回一个NSUInteger类型的值，该值可用于散列表结构中；
        两个相同对象必须拥有相同的散列值；
        如果散列值被用于决定对象在集合中的位置，那么当对象处于集合中时通过hash方法获得的该对象的散列值一定不会改变；；
     
     2.发送消息
     NSObject类定义了一个performSelector：实例方法家族，使用这些方法可以像对象发送消息；
        该家族中的每个成员都设置了一个用于识别消息的选择器参数；
        performSelector：方法等同于一条标准的OC对象消息；
            [atom logInfo] <=> [atom performSelector:@selector(logInfo)];
        与标准对象消息的区别在于：它能使你发送在运行时确定的消息，因为变量选择器值可作为参数传递；
        （部分内容可参考第七章内容）
     
     NSObject协议声明了performSelector方法的多种变形，如：
        performSelector：withObject：
        performSelector：withObject：withObject：
        可用于处理不同参数数量（0~2）的消息；
     
     NSObject类也定义了多个performSelector：方法；
        当向对象发送消息时，这些方法能够提供额外的功能，具体如下：
        1）线程选择（当前、后台和用户指定的）；
        2）方法调用语义（同步、语义）；
        3）事件处理模式；
        4）延迟方法调用；
     
     3.创建和初始化
     再来看一些用于加载和初始化类的NSObject方法；
     
     类方法initialize用于在加载类之后初次使用该类前（即在该类及其子类被发送第一条消息前）初始化这个类；
        在执行程序过程中，任何类中的该方法至多仅会被调用一次；
        实际上，如果某个类没有被使用，那么该类中的这个方法就不会被调用；
        initialize方法具有线程安全性，而且在被发送给一个类之前，总会被先发送给该类的所有父类；
            为了避免该方法被调用两次的情况（除了被目标类调用外又被父类调用），应使用验证调用者为目标类而非父类的逻辑实现initialize方法，如：
     
     +(void)initialize{
        if(self == [MyClass class]){//注意类方法中self的含义
            //初始化逻辑
        }
     }
     这样，初始化逻辑仅会对实现了initialize方法的类的接收器执行条件测试；
     
     在已经实现的情况下，NSObject类的load方法也会在类被加载之后调用一次，在以下几个方面，它和initialize方法不同：
     1）load方法会在initialize方法调用前、类被加载之后立即调用；
        实际上：
            对于以静态方式链接的类（可执行程序的组成部分），调用load方法的操作在调用main（）函数的操作之前执行；
            如果load方法是由可选包裹中的类实现的，那么该包以动态方式被加载时load方法就会运行；
        需要很小心的使用load方法，因为启动应用过程中它的次序非常靠前；
            尤其是，当该方法被调用时，程序的自动释放池（通常）还不存在，其他类可能还没有加载等；
     2）load方法可以由类实现也可以由分类实现；
        实际上：
            一个类的所有分类都能实现其本身的load方法；initialize方法永远都不能在分类中重写；
     3）在已经实现的情况下，当类被加载时，load方法会被调用一次；
        在已经实现的情况下，当类收到第一条消息时，initialize方法会被调用一次（类没被使用，initialize就不会被调用）；

     NSObject类的new方法能够分配新的类实例，然后初始化它；
        new方法集alloc和init方法的功能于一身；
        即，Atom *atom = [[Atom alloc] init]; <=>  Atom *atom = [Atom new];
        new方法会调用类中默认的init方法，但不会调用自定义的init方法；
     
     10.1.3 NSProxy类
     
     NSProxy类是一个抽象的根类，用于实现代理模式；
        它通过实现一组经过简化的方法，代替目标对象捕获和处理几乎所有消息；
        NSProxy类实现了由NSObject协议声明的方法，而且声明了必须由子类实现的两个方法；
            -(NSMethodSignature *)methodSignatureForSelector:(SEL)sel;
            -(void)forwardInvocation:(NSInvocation *)invocation;
     
     抽象类：
        指无法直接实例化的类，它们可能没有实现代码，或者拥有的实现代码不完整；
        它们可能还拥有必须实现的方法；
        OC没有对抽象类提供语言级支持；
            按照惯例：OC程序中，应将抽象类设置为带有一个初始化方法（至少一个）和一个或多个必须实现方法的类；
     
     （部分内容可参见第九章）
     
     NSProxy的子类（即具体实现的类）必须声明并实现至少一个init方法；
     Foundation框架提供了多个NSProxy类的具体实现类：
     1）NSDistantObject类：
        定义其他应用程序或线程中对象的代理；
     2）NSProtocolChecker类：
        定义对象，使用这种对象可以限定哪些消息能够发送给另一个对象；
     
     第九章中我们实现了一个NSProxy的具体实现类AspectProxy，用它为代理的对象提供横切（AOP）功能；
     
     
     ======================================本章内容暂时跳过，继续后续章节========================================
     
     10.2 字符串
     10.2.1 NSString类
     10.2.2 NSAttributedString类
     10.2.3 NSString常量
     10.2.4 格式化字符串
     
     10.3 值对象
     10.3.1 NSValue类
     10.3.2 NSNumber类
     10.3.3 NSDecimalNumber类
     10.3.4 NSNumber常量
     10.3.5 对日期和时间的支持
     10.3.6 NSCache类
     
     10.4 集合
     10.4.1 NSArray类
     10.4.2 NSPointerArray类
     10.4.3 NSDictionary类
     10.4.4 NSMapTable类
     10.4.5 NSSet类
     10.4.6 NSCountedSet类
     10.4.7 NSHashTable类
     10.4.8 NSPointerFunctions类
     
     10.5 XML处理类
     10.5.1 XML的DTD处理类
     10.5.2 基于树形形状的XML处理类
     10.5.3 事件驱动的XML处理类
     
     10.6 谓词类
     
     10.7 小结
     
     
     */
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end
